Page({
  data: {
    weeks: Array.from({length: 20}, (_, i) => `第${i + 1}周`),  // 保持不变
    showAttendanceForm: false,
    courseList: [], // 课程列表
    currentCourseIndex: 0, // 当前选中的课程索引
    currentCourse: {}, // 当前课程信息
    currentDate: '', // 当前日期
    studentList: [], // 学生列表
    presentCount: 0, // 出勤人数
    absentCount: 0, // 缺勤人数
    lateCount: 0,//迟到人数
    selectedStudentIndex: 0, // 选择的学生索引
    attendanceStatus: 'present', // 默认考勤状态
    displayWeek: 1 , // 新增：用于显示当前是第几周
    showAbsentList: false, // 新增控制显示状态
    filteredStudents: []   // 新增过滤后的学生列表
  },
  

  onLoad() {
    if (!wx.getStorageSync('teacherId')) {
      wx.redirectTo({ url: '/pages/profile/profile' });
      return;
    }
    this.setCurrentDate()
    this.fetchCourseList() // api->加载课程信息->考勤信息
    
  },
   
  // 添加onShow生命周期函数，确保页面显示时刷新数据
  onShow() {
    // 如果已经加载过课程，只刷新学生列表数据
    if (this.data.courseList && this.data.courseList.length > 0 && this.data.currentCourse._id) {
      // 刷新当前课程的学生考勤数据
      this.fetchStudentList(this.data.currentCourse._id);
      console.log('[考勤记录] 页面显示，刷新学生考勤数据');
    } else {
      // 如果没有课程数据，重新加载
      this.fetchCourseList();
    }
    
    // 更新日期显示（以防跨天使用）
    this.setCurrentDate();
  },
  //切换周
  onWeekChange(e) {
    const weekIndex = parseInt(e.detail.value);
  this.setData({
    currentWeek: weekIndex,
    displayWeek: weekIndex + 1
  }, () => {
    // 自动重新加载数据
    if (this.data.currentCourse._id) {
      this.fetchStudentList(this.data.currentCourse._id);
    }
  });
  },
  // 新增：切换缺勤/迟到学生列表
  toggleAbsentList(e) {
    //是否展示ansent/late
    console.log('切换缺勤/迟到学生列表')
    const filtered = this.data.studentList.filter(s => 
      ['absent', 'late'].includes(s.status)
    );
    this.setData({
      showAbsentList: !this.data.showAbsentList,
      filteredStudents: filtered
    });
  },
  // 显示考勤表单
  showForm() {
    this.setData({ showAttendanceForm: true });
  },
   // 取消考勤记录
   cancelAttendance() {
    this.setData({ showAttendanceForm: false, attendanceStatus: 'present' });
  },
  // 设置当前日期
  setCurrentDate() {
    const now = new Date()
    const date = now.toLocaleDateString('zh-CN', {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit',
      weekday: 'long'
    })
    this.setData({ currentDate: date })
  },

  // 加载课程信息->考勤信息
  async fetchCourseList() {
    try {
      wx.showLoading({ title: '加载中...' })
      const app = getApp();
      const db = app.getDB();
      const res = await db.collection('courses')
        .where({
          teacherId: wx.getStorageSync('teacherId')
        })
        .get({enableCache:false})
      this.setData({ 
        courseList: res.data,
        currentCourse: res.data[0] || {}
      })
      if (res.data.length > 0) {
        this.fetchStudentList(res.data[0]._id)
      }
      wx.hideLoading()
    } catch (err) {
      console.error('获取课程列表失败：', err)
      wx.hideLoading()
      wx.showToast({
        title: '获取课程失败',
        icon: 'none'
      })
    }
  },

  // 后api ->获取学生列表
  async fetchStudentList(courseId) {
    try {
      wx.showLoading({ title: '加载学生名单...' })
      const app = getApp();
      const db = app.getDB();
      // 先查询中间表获取学生ID列表
    const courseStudentsRes = await db.collection('course_students')
    .where({ courseId })
    .get();

  const studentIds = courseStudentsRes.data.map(item => item.studentId);
  
  // 并行获取学生列表和考勤记录
  const [studentsRes, attendanceRes] = await Promise.all([
    studentIds.length > 0 
      ? db.collection('students')
          .where({ _id: db.command.in(studentIds) })
          .get() 
      : { data: [] }, // 处理无学生的情况
    db.collection('attendance').where({
      courseId: courseId,
      week: this.data.displayWeek
    }).get()
  ]);

       // 声明考勤记录映射
       const attendanceMap = new Map();
       attendanceRes.data.forEach(record => {
        if (record.records) {
          record.records.forEach(r => {
            attendanceMap.set(r.studentId, r.status);
          });
        }
      });
      // 打印结果
      console.log('查询student:',studentsRes)
      console.log('查询attend:',attendanceRes)
    // 合并学生数据
    const studentList = studentsRes.data.map(student => ({
      ...student,
      status: attendanceMap.get(student._id) || '' // 无记录时为空字符串
    }));
    // 计算初始统计数据
    const presentCount = studentList.filter(s => s.status === 'present').length;
    const absentCount = studentList.filter(s => s.status === 'absent').length;
    const lateCount = studentList.filter(s => s.status === 'late').length;
      // 处理考勤数据
      console.log('attendanceMap',attendanceMap)
      console.log('studentList---》',studentList)
    this.setData({ 
      studentList,
      presentCount,
      absentCount,
      lateCount
    });

      
      wx.hideLoading()
    } catch (err) {
      console.error('获取学生列表失败：', err)
      wx.hideLoading()
      wx.showToast({
        title: '获取学生名单失败',
        icon: 'none'
      })
    }
  },

  // 处理课程选择
  handleCourseChange(e) {
    const index = parseInt(e.detail.value)
    const course = this.data.courseList[index]
    
    this.setData({
      currentCourseIndex: index,
      currentCourse: course
    })
    this.fetchStudentList(course._id)
  },

  //处理考勤状态变化，点击一条item的出勤，其他的出勤也变了
  handleStatusChange(e) {
    const studentId = e.currentTarget.dataset.studentId; // 获取学生ID
    console.log('current_student:{}',studentId)//注意wxml里面的是item_id,否则undefined
    const status = e.detail.value; // 获取新的状态
    // 更新学生状态
    const studentList = this.data.studentList.map(student => {
      if (student._id === studentId) {
        return { ...student, status }; // 只更新当前学生的状态
      }
      return student; // 其他学生保持不变
    });
    // 计算出勤和缺勤人数
    const presentCount = studentList.filter(s => s.status === 'present').length;
    const absentCount = studentList.length - presentCount;
    this.setData({ studentList, presentCount, absentCount });
  },

  async confirmAttendance() {
    try {
      const { selectedStudentIndex, attendanceStatus, studentList, currentCourse, currentDate } = this.data;
  
      // 获取选择的学生信息
      const selectedStudent = studentList[selectedStudentIndex];
  
      // 创建考勤记录
      const attendanceRecord = {
        courseId: currentCourse._id,
        courseName: currentCourse.courseName,
        className: currentCourse.className,
        date: currentDate,
        studentId: selectedStudent.id,
        studentName: selectedStudent.name,
        status: attendanceStatus,
        createTime: new Date() // 记录创建时间
      };
  
      // 保存考勤记录到数据库
      const app = getApp();
      const db = app.getDB();
      await db.collection('attendance').add({
        data: attendanceRecord
      });
  
      wx.showToast({
        title: '考勤记录已保存',
        icon: 'success'
      });
  
      // 关闭表单
      this.setData({ showAttendanceForm: false });
  
      // 更新学生列表中的状态
      const updatedStudentList = studentList.map(student => {
        if (student.id === selectedStudent.id) {
          return { ...student, status: attendanceStatus }; // 更新状态
        }
        return student;
      });
  
      this.setData({ studentList: updatedStudentList });
  
    } catch (err) {
      console.error('保存考勤记录失败：', err);
      wx.showToast({
        title: '保存失败',
        icon: 'none'
      });
    }
  },
  //后api->  提交考勤记录（保存当前第几周的数据，同时查询的时候也根据第几周来查考勤数据。）
async submitAttendance() {
  try {
    // 检查当前课程是否已选择
    if (!this.data.currentCourse._id) {
      wx.showToast({
        title: '请先选择课程', // 提示用户选择课程
        icon: 'none'
      });
      return; // 如果没有选择课程，退出方法
    }

    wx.showLoading({ title: '提交中...' }); // 显示加载提示，表示正在提交考勤记录
    // const db = wx.cloud.database(); // 获取云数据库的引用
    const app = getApp();
    const db = app.getDB();
    const currentWeek = this.data.displayWeek; // 获取当前周数
    // 检查是否已经存在考勤记录
    const existingAttendanceRes = await db.collection('attendance')
      .where({
        courseId: this.data.currentCourse._id, // 根据当前课程ID查询
        // date: this.data.currentDate ,// 根据当前日期查询
        week: currentWeek // 增加周数条件
      })
      .get(); // 获取考勤记录

    // 如果存在考勤记录
    if (existingAttendanceRes.data.length > 0) {
      // 更新考勤记录
      await db.collection('attendance').doc(existingAttendanceRes.data[0]._id).update({
        data: {
          records: this.data.studentList.map(student => ({
            studentId: student._id, // 学生ID
            studentName: student.studentName, // 学生姓名
            studentNumber: student.studentNumber, // 学生学号
            status: student.status // 学生考勤状态
          })),
          presentCount: this.data.presentCount, // 更新出勤人数
          absentCount: this.data.absentCount, // 更新缺勤人数
          week: currentWeek, // 新增周数字段
          updateTime: db.serverDate() // 更新记录的时间
        }
      });
      wx.showToast({
        title: '考勤记录已更新', // 提示用户考勤记录已更新
        icon: 'success'
      });
    } else {
      // 如果不存在考勤记录，新增考勤记录
      await db.collection('attendance').add({
        data: {
          courseId: this.data.currentCourse._id, // 当前课程ID
          courseName: this.data.currentCourse.courseName, // 当前课程名称
          className: this.data.currentCourse.className, // 当前班级名称
          date: this.data.currentDate, // 当前日期
          teacherId: wx.getStorageSync('teacherId'), // 教师ID
          records: this.data.studentList.map(student => ({
            studentId: student.id, // 学生ID
            studentName: student.name, // 学生姓名
            status: student.status // 学生考勤状态
          })),
          presentCount: this.data.presentCount, // 出勤人数
          absentCount: this.data.absentCount, // 缺勤人数
          week: currentWeek, // 新增周数字段
          createTime: db.serverDate() // 创建记录的时间
        }
      });
      wx.showToast({
        title: '考勤提交成功', // 提示用户考勤提交成功
        icon: 'success'
      });
    }

    wx.hideLoading(); // 隐藏加载提示
  } catch (err) {
    console.error('提交考勤记录失败：', err); // 打印错误信息
    wx.hideLoading(); // 隐藏加载提示
    wx.showToast({
      title: '提交失败', // 提示用户提交失败
      icon: 'none'
    });
  }
}
})